package org.example.config;

import org.example.constants.CommonConstants;
import org.example.util.JwtUtil;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;

import java.util.UUID;

import static org.example.constants.CommonConstants.API_INTERNAL_HEADER_NAME;

/**
 * @description: 内部API过滤器，用于在请求中添加API内部令牌头
 * @date: 2023/9/15 15:00
 * @author: zxy
 */
@Component
public class InternalApiFilter implements GlobalFilter {


    /**
     * 网关过滤器方法，用于在请求中添加API内部令牌头
     *
     * @param exchange 服务器网络交换对象，包含当前请求和响应的信息
     * @param chain    网关过滤器链，用于将请求传递给下一个过滤器
     * @return 返回一个Mono<Void>对象，表示异步操作的完成
     */
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 获取当前请求并创建其变体，添加API内部令牌头
        // 使用JwtUtil工具类生成令牌，包含服务名称和随机UUID
        ServerHttpRequest request = exchange.getRequest().mutate()
                .header(API_INTERNAL_HEADER_NAME, JwtUtil.createApiToken(CommonConstants.ServiceName.GATEWAY_SERVICE.getServiceName(), UUID.randomUUID().toString()))
                .build();
        // 将修改后的请求传递给过滤器链中的下一个过滤器
        return chain.filter(exchange.mutate().request(request).build());

    }
}
